Chapter 3 Buffer Overflow
#CSAPP
本节介绍了一个非常有趣的例子,是本书目前为止最有趣的部分,看得最认真的一集
gets() 极其危险:没有执行缓存区写入的大小检查,若将可执行代码和填充字节写入,就会向着栈底覆盖原有数据,如果用 jmp 语句恰好覆盖上层函数的返回地址,那么就可以跳转到注入的恶意代码执行,操纵目标机器。
一些防范手段
-
栈地址随机化:在栈底插入一段随即长度的无意义字节使得注入代码的 jmp 语句无法使用普遍化的手段确定当前的栈的位置。该安全手段属于 ASLR(address-space layout randomiation) 技术的一部分,该技术将程序代码、库代码、栈、全局变量、堆加载到内存中的随机位置。
- 反击手段:在注入代码前端插入一段 no-op 使得跳转到这段 no-op 代码会 fall through 到注入代码
-
栈损毁检查:函数开始调用时生成一个随机的 canary 值,如果 buffer 溢出就会覆盖 canary 的值,在函数返回时检测 canary 是否正确。
-
限制区域代码的权限:readable, writable, executable